/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nys.conci.cliente.bean;

import com.nys.conci.base.BeanBase;
import com.nys.conci.base.excepcion.ExcepcionManager;
import com.nys.conci.base.utilitario.EtiquetasUtil;
import com.nys.conci.base.utilitario.MensajeUtil;
import com.nys.conci.cliente.entidad.Cliente;
import com.nys.conci.cliente.entidad.EstadoCliente;
import com.nys.conci.usuario.servicio.ServicioAdministracion;
import com.nys.conci.usuario.servicio.ServicioControlUsuario;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;

/**
 *
 * @author Yeudy10
 * @since 29/01/2013
 */
@ManagedBean
@ViewScoped
public class BeanRegistroEstadoCliente extends BeanBase {

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<     VARIABLES     >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    @Inject
    private ServicioAdministracion sa;
    @Inject
    private ServicioControlUsuario scu;
    private EstadoCliente estadoCliente;
    private EstadoCliente estadoClienteSelect;
    private EstadoCliente estadoClienteTabla;
    private List<EstadoCliente> lista_estado_cliente;
    private String nombre;
    private String descripcion;
    private String numero;
    boolean modificar;

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<  INICIALIZARORES  >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Constructor
     */
    public BeanRegistroEstadoCliente() {
        this.inicializar();
    }

    /**
     * Inicializa las variables del bean, al acceder al constructor
     */
    private void inicializar() {
        try {
            setNombre("");
            setDescripcion("");
            numero = "1";
            setEstadoCliente(new EstadoCliente());
            setEstadoClienteSelect(new EstadoCliente());
            setEstadoClienteTabla(new EstadoCliente());
            setLista_estado_cliente(new ArrayList<EstadoCliente>());
            setModificar(false);
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Inicializas las variables y atributos del bean, despues del llamado del
     * constructor. Es utilizado para las inicializaciones que utilicen datos de
     * objetos injectados.
     */
    @Override
    @PostConstruct
    public void inicializarPost() {
        cargarEstadosClientes();
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      MÉTODOS      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * Método que consulta una lista de estados de clientes
     */
    public void cargarEstadosClientes() {
        try {
            setLista_estado_cliente(new ArrayList<EstadoCliente>());
            setLista_estado_cliente(sa.consultarListaEstadoCliente());
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que guarda o actualiza un estado del cliente y carga la lista con
     * el estado nuevo que se guardo
     */
    public void agregarEstadoCliente() {
        try {
            if (validarCampos()) {
                if (modificar) {
                    getEstadoClienteSelect().setDescripcion(getDescripcion());
                    getEstadoClienteSelect().setNombre(getNombre());
                    sa.guardarEstadoCliente(getEstadoClienteSelect(), modificar);
                } else {
                    setEstadoCliente(new EstadoCliente());
                    getEstadoCliente().setDescripcion(getDescripcion());
                    getEstadoCliente().setNombre(getNombre());
                    sa.guardarEstadoCliente(getEstadoCliente(), modificar);
                }
                cargarEstadosClientes();
                limpiar();
                modificar = false;
                numero = "1";
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que limpia los campos de la pantalla
     */
    public void limpiar() {
        try {
            nombre = "";
            descripcion = "";
            setEstadoCliente(new EstadoCliente());
            setEstadoClienteSelect(new EstadoCliente());
            setEstadoClienteTabla(new EstadoCliente());
            modificar = false;
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida que los campos de la pantalla esten bien digitados
     *
     * @return true si esta bien false de lo contrario
     */
    private boolean validarCampos() {
        boolean resultado = true;
        if (getNombre() == null || getNombre().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Nombre");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_nombre", mensaje);
            resultado = false;
        }
        if (getDescripcion() == null || getDescripcion().trim().isEmpty()) {
            String mensaje = EtiquetasUtil.obtenerEtiqueta("campo.requerido.parametro", "Descripción");
            MensajeUtil.agregarMensajeErrorComponente("form_conci:id_descripcion", mensaje);
            resultado = false;
        }

        if (lista_estado_cliente != null && nombre != null && !nombre.isEmpty()) {
            boolean va = false;
            for (EstadoCliente estado : lista_estado_cliente) {
                if (modificar && !estado.getId_estado().equals(estadoClienteSelect.getId_estado()) && estado.getNombre().equals(nombre)) {
                    va = true;
                } else if (!modificar && estado.getNombre().equals(nombre)) {
                    va = true;
                }
            }
            if (va) {
                String mensaje = "No se permite ingresar estados de clientes con nombres iguales";
                MensajeUtil.agregarMensajeError(mensaje);
                resultado = false;
            }
        }
        return resultado;
    }

    /**
     * Método llamado cuando se selecciona una fila de la tabla de estados
     */
    public void modificarEstadoCliente() {
        try {
            setEstadoClienteSelect(getEstadoClienteTabla());
            modificar = true;
            setDescripcion(getEstadoClienteSelect().getDescripcion());
            setNombre(getEstadoClienteSelect().getNombre());
            numero = "0";
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que elimina un estado del cliente
     */
    public void eliminarEstadoCliente() {
        try {
            if (validarUsado()) {
                sa.eliminar(estadoClienteSelect);
                limpiar();
                cargarEstadosClientes();
                numero = "1";
                setDescripcion("");
                setNombre("");
                String mensaje = "Se eliminó el estado seleccionado";
                MensajeUtil.agregarMensajeInfo(mensaje);
            }

        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
    }

    /**
     * Método que valida si el estado de clientes esta siendo utilizado por un
     * cliente
     *
     * @return true o false
     */
    private boolean validarUsado() {
        try {
            Cliente c = scu.consultarClienteIdEstado(estadoClienteSelect.getId_estado());
            if (c != null) {
                String mensaje = "No se puede eliminar, el estado esta asociado a un cliente";
                MensajeUtil.agregarMensajeError(mensaje);
                return false;
            }
        } catch (Exception ex) {
            ExcepcionManager.manejarExcepcion(ex);
        }
        return true;
    }

//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<      GET & SET      >>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<*******************<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    /**
     * @return the modificar
     */
    public boolean isModificar() {
        return modificar;
    }

    /**
     * @param modificar the modificar to set
     */
    public void setModificar(boolean modificar) {
        this.modificar = modificar;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the descripcion
     */
    public String getDescripcion() {
        return descripcion;
    }

    /**
     * @param descripcion the descripcion to set
     */
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the estadoCliente
     */
    public EstadoCliente getEstadoCliente() {
        return estadoCliente;
    }

    /**
     * @param estadoCliente the estadoCliente to set
     */
    public void setEstadoCliente(EstadoCliente estadoCliente) {
        this.estadoCliente = estadoCliente;
    }

    /**
     * @return the estadoClienteSelect
     */
    public EstadoCliente getEstadoClienteSelect() {
        return estadoClienteSelect;
    }

    /**
     * @param estadoClienteSelect the estadoClienteSelect to set
     */
    public void setEstadoClienteSelect(EstadoCliente estadoClienteSelect) {
        this.estadoClienteSelect = estadoClienteSelect;
    }

    /**
     * @return the estadoClienteTabla
     */
    public EstadoCliente getEstadoClienteTabla() {
        return estadoClienteTabla;
    }

    /**
     * @param estadoClienteTabla the estadoClienteTabla to set
     */
    public void setEstadoClienteTabla(EstadoCliente estadoClienteTabla) {
        this.estadoClienteTabla = estadoClienteTabla;
    }

    /**
     * @return the lista_estado_cliente
     */
    public List<EstadoCliente> getLista_estado_cliente() {
        return lista_estado_cliente;
    }

    /**
     * @param lista_estado_cliente the lista_estado_cliente to set
     */
    public void setLista_estado_cliente(List<EstadoCliente> lista_estado_cliente) {
        this.lista_estado_cliente = lista_estado_cliente;
    }
}
